package com.wjn.basic.hashcode_equals;

import java.util.HashMap;
import java.util.Objects;

/**
 * 自定义类
 * hashcode方法  & equals方法  自定义对象在放入hashmap中一定要重写
 *
 * 只重写hashcode可能会出现hashcode相等，值不相等的情况
 * 只重写equals  hashcode 还是继承的object,效率太低，比较对象先比较hashcode,hashcode 相等再比较equals,hashcode 不同则对象不相同。
 */
public class KeyDemo {
    private Integer key;

    public KeyDemo(Integer key){
        this.key=key;
    }
    //重写equals
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        KeyDemo keyDemo = (KeyDemo) o;
        return key.equals(keyDemo.key);
    }
    //重写hashcode方法获取hashcode
    @Override
    public int hashCode() {
        return Objects.hash(key);
    }

    public static void main(String[] args) {
        KeyDemo keyDemo1=new KeyDemo(1);
        KeyDemo keyDemo2=new KeyDemo(1);
        System.out.println(keyDemo1.equals(keyDemo2));
        HashMap<KeyDemo,String> hashMap=new HashMap<KeyDemo,String>();
        hashMap.put(keyDemo1,"key is 1");//
        System.out.println(hashMap.get(keyDemo2));
        //没有重写hashcode方法前为false，原因是没有重写hashcode方法前继承的object,
        // h1的hashcode返回的是h1的内存地址，h2也是
    }
}
